import { _decorator, Component, Node, sys } from 'cc';
import { core_view } from '../../core/view/core_view';
import { gameVM } from './gameVM';
import { Log } from '../../core/logger/LoggerGlobal';
import { autoInitLogger } from '../../core/logger/LoggerConfig';
import { configureServices, getService } from '../bootstrap';
import { ServiceIdentifiers } from '../../core/di';
import { GameApplication } from '../GameApplication';
import { FixedUpdateManager } from '../ecs/FixedUpdateManager';

const { ccclass, property } = _decorator;

/**
 * Game 组件 - 游戏入口
 * 
 * 职责：
 * 1. 作为场景的根组件
 * 2. 初始化游戏应用
 * 3. 管理 MVVM 的 View 层
 * 4. 驱动游戏循环
 */
@ccclass('game')
export class game extends core_view {
    @property(Node)
    sceneRoot: Node | null = null; // 场景根节点（可以在编辑器中指定）
    
    @property({ tooltip: '是否启用调试模式' })
    debugMode: boolean = true;
    
    @property({ tooltip: '是否预热对象池' })
    warmupPools: boolean = false;
    
    @property({ tooltip: '是否显示性能统计' })
    showStats: boolean = true;
    
    // 统计显示间隔
    private statsInterval: number = 2000; // 2秒
    private lastStatsTime: number = 0;
    
    /**
     * 加载时初始化游戏应用
     */
    protected async onLoad(): Promise<void> {
        super.onLoad();
        
        // 初始化日志系统
        autoInitLogger();
        
        Log.game.info('开始初始化...');
        
        try {
            // 配置 DI 容器
            configureServices();
            
            // 从 DI 容器获取游戏应用实例
            const gameApp = getService<GameApplication>(ServiceIdentifiers.GameApplication);
            
            // 初始化游戏应用（传入场景根节点）
            await gameApp.initialize(this.sceneRoot || this.node, {
                debugMode: this.debugMode,
                warmupPools: this.warmupPools
            });
            
            // 保存引用（用于 update 和 destroy）
            (this as any).gameApp = gameApp;
            
            Log.game.info('✅ 初始化完成');
        } catch (error) {
            Log.game.error('❌ 初始化失败', { error });
        }
    }
    
    /**
     * 启动时开始游戏
     */
    protected onStart(): void {
        super.onStart();
        
        const gameApp = (this as any).gameApp as GameApplication;
        if (gameApp) {
            // 启动游戏
            gameApp.start();
            Log.game.info('🎮 游戏开始');
        }
    }
    
    /**
     * 初始化 ViewModel
     */
    protected init(): void {
        // 初始化 ViewModel（MVVM 层）
        this.initializeViewModel(gameVM);
    }
    
    /**
     * 每帧更新（约 60 FPS）
     */
    update(dt: number): void {
        const gameApp = (this as any).gameApp as GameApplication;
        if (gameApp) {
            // 更新游戏应用（驱动 ECS，包含固定时间步长更新）
            gameApp.update(dt);
        }
        
        // 调用父类 update（MVVM 响应式更新）
        super.update(dt);
        
        // 定期显示统计信息
        if (this.showStats && this.debugMode) {
            const now = Date.now();
            if (now - this.lastStatsTime >= this.statsInterval) {
                this.printPerformanceStats();
                this.lastStatsTime = now;
            }
        }
    }
    
    /**
     * 打印性能统计
     */
    private printPerformanceStats(): void {
        const fixedUpdateManager = getService<FixedUpdateManager>(ServiceIdentifiers.FixedUpdateManager);
        const stats = fixedUpdateManager.getStats();
        
        Log.performance.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
        Log.performance.info('📊 性能统计');
        Log.performance.info(`逻辑: ${stats.currentLogicFPS.toFixed(1)} FPS (目标: ${stats.targetLogicFPS.toFixed(0)} FPS)`);
        Log.performance.info(`渲染: ${stats.currentRenderFPS.toFixed(1)} FPS`);
        Log.performance.info(`逻辑耗时: 平均 ${stats.averageLogicTime.toFixed(2)}ms, 最大 ${stats.maxLogicTime.toFixed(2)}ms`);
        Log.performance.info(`渲染耗时: 平均 ${stats.averageRenderTime.toFixed(2)}ms, 最大 ${stats.maxRenderTime.toFixed(2)}ms`);
        Log.performance.info(`插值因子: ${stats.interpolationAlpha.toFixed(4)}`);
        if (stats.skippedFrames > 0) {
            Log.performance.warn(`⚠️  跳帧次数: ${stats.skippedFrames}`);
        }
        Log.performance.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
    }
    
    /**
     * 销毁时清理
     */
    onDestroy(): void {
        Log.game.info('销毁游戏');
        
        const gameApp = (this as any).gameApp as GameApplication;
        if (gameApp) {
            gameApp.destroy();
        }
        
        super.onDestroy();
    }
}


